// 1. 引入 express 模块
const express = require("express");

// 2. 创建应用对象
const app = express();

// 局部生效的中间件: 不使用app.use()注册,而是直接注册在路由上
const mw = function (req, res, next) {
  console.log("这是第一个中间件函数");
  // 把流转关系，转交给下一个中间件或路由
  next();
};

/**
 * 控制台输出结果:
 * 这是第一个中间件函数
 * 这是第二个中间件函数
 *
 * 表明: 客户端发起请求时,会依次触发两个全局的中间件函数
 */
app.get("/", mw, (req, res) => {
  res.send("Hello Express - 111 - 中间件测试-局部生效中间件");
});

app.get("/user", (req, res) => {
  res.send("Hello Express - 111 - 中间件测试-不使用中间件");
});

const mw2 = function (req, res, next) {
  console.log("这是第二个中间件函数");
  // 把流转关系，转交给下一个中间件或路由
  next();
};

app.get("/home", mw, mw2, (req, res) => {
  res.send("Hello Express - 111 - 中间件测试-局部生效中间件2-使用多个中间件");
});
app.get("/index", [mw, mw2], (req, res) => {
  res.send("Hello Express - 111 - 中间件测试-局部生效中间件2-使用多个中间件");
});

app.listen(3000, () => {
  console.log("Server is running on http://localhost:3000");
});

/**
 * 总结:
 * 1、注意事项:
 * ① 一定要在路由之前注册中间件
 * ② 客户端发送过来的请求，可以连续调用多个中间件进行处理
 * ③ 执行完中间件的业务代码之后，不要忘记调用 next() 函数
 * ④ 为了防止代码逻辑混乱，调用 next() 函数后不要再写额外的代码
 * ⑤ 连续调用多个中间件时，多个中间件之间，共享 req 和 res 对象
 *
 * 2、中间件分类:
 *   应用级别中间件
 *  路由级别中间件
 *  错误处理中间件
 * 第三方中间件
 * Express 内置中间件
 */
